/*
 * 装饰模式: 动态地将职责附加到对象上，用于扩展功能，提供比继承更有弹性的替代方案。
 * 				装饰者和被装饰者有相同的超类型；
 * 				可以用一个或是多个装饰者包装一个对象；
 * 				在任何需要原始对象的地方可以用装饰过的对象替代之；
 * 				装饰者在所委托的被装饰者的行为之前或之后加入自己的行为，达到特定的目的；
 *
 * 设计原则: 类的设计应对扩展开放，对修改关闭。
 * 
 * example context: isearch搜索引擎的搜索结果在不同的场景中需要有不同的排序
 * 				最初始的列表由基本的输入参数（类目，关键字）计算产生。
 * 				然后如果有关键字的，需要在初始结果产生后先马上使用MLR算法排序
 * 				如果是租房的需要时间优先排序
 * 				如果是餐饮的需要口碑指数排序
 *
 */

package headfirst.decorater;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

public class HFDecorator 
{
	public static void main(String[] args) 
	{
		System.out.println("in HFDecorator");
		
		String[] searchConditions = new String[10];
		searchConditions[0] = "";			//key words
		searchConditions[1] = "10";			//类目id, 10 旅游， 11 租房， 12 餐饮
		searchConditions[2] = "2595";		//城市id
		searchConditions[3] = "1";			//结果列表页码
		searchConditions[4] = "20";			//结果列表页长度
		
		RawSearchReuslt sr = new RawSearchReuslt();
		sr.dosearch(searchConditions);
		doSortAndShow(sr, searchConditions);
		
		searchConditions[0] = "";	//key words
		searchConditions[1] = "11";			//类目id, 10 旅游， 11 租房， 12 餐饮
		searchConditions[2] = "2595";		//城市id
		searchConditions[3] = "1";			//结果列表页码
		searchConditions[4] = "20";			//结果列表页长度

		sr.dosearch(searchConditions);
		doSortAndShow(sr, searchConditions);
		
		searchConditions[0] = "古荡新村";	//key words
		sr.dosearch(searchConditions);
		doSortAndShow(sr, searchConditions);
		
		searchConditions[0] = "";	//key words
		searchConditions[1] = "12";			//类目id, 10 旅游， 11 租房， 12 餐饮
		searchConditions[2] = "2595";		//城市id
		searchConditions[3] = "1";			//结果列表页码
		searchConditions[4] = "20";			//结果列表页长度

		sr.dosearch(searchConditions);
		doSortAndShow(sr, searchConditions);
		
		searchConditions[0] = "外婆家";	//key words
		sr.dosearch(searchConditions);
		doSortAndShow(sr, searchConditions);
	}
	
	public static void doSortAndShow(RawSearchReuslt sr, String[] searchConditions)
	{
		if(null == searchConditions || 
				5 > searchConditions.length ||
				null == sr)
		{
			return;
		}
		SearchResult srsoted = sr;
		
		//如果有关键字的，需要在初始结果产生后先马上使用MLR算法排序
		if(0 < searchConditions[0].trim().length())
		{
			srsoted = new MLRSortedSearchResult(srsoted);
		}
		//如果是租房的需要时间优先排序
		if(searchConditions[1].equals("11"))
		{
			srsoted = new TimeSortedSearchResult(srsoted);
		}
		//如果是餐饮的需要口碑指数排序
		if(searchConditions[1].equals("12"))
		{
			srsoted = new KBRankSortedSearchResult(srsoted);
		}
		
		ArrayList< HashMap<String, String> > slist = srsoted.getSortedList();
		for(int i =0; i<slist.size(); ++i)
		{
			System.out.println("=========="+i+"=========");
			HashMap<String, String> kvlist = slist.get(i);
			Set<String> keyset = kvlist.keySet();
			Iterator<String> itrkey = keyset.iterator();
			while(itrkey.hasNext())
			{
				String keyname = itrkey.next();
				String value = kvlist.get(keyname);
				System.out.println("\t\t"+keyname+"\t=\t"+value);
			}
		}
	}
}
